﻿//#include "symath.h"
//#include <iostream>
//#include "sygraph.h"
//#include <conio.h>
//#include "sytime.h"
//#include <Windows.h>
//
//using namespace std;
//using namespace sy::math;
//using namespace sy::draw;
//using namespace sy::time;
//
//struct Camera
//{
//	Mat4 translate;
//	Mat4 rotate;
//
//public:
//	// 创建一个不动的摄像机 ，(x, y, z) 为摄像机的位置，摄像机看向原点
//	static Camera CreateCamera(float x, float y, float z)
//	{
//		Camera ret;
//
//		Vector4 cameraPosition = Vector4(-x, -y, -z, 1);
//		Mat4 rotate, translate;
//		Vector4 cameraDir = Vector4(x, y, z, 0).Normalize();
//		// 世界坐标的上
//		Vector4 worldUp = Vector4::Up();
//		Vector4 right = Vector4::Cross(cameraDir, worldUp);
//		Vector4 cameraUp = Vector4::Cross(right, cameraDir);
//		rotate.SetRow(0, right);
//		rotate.SetRow(1, cameraUp);
//		rotate.SetRow(2, cameraDir.Normalize());
//		rotate[3][3] = 1.0f;
//
//		translate.SetCol(3, cameraPosition);
//
//		ret.rotate = rotate;
//		ret.translate = translate;
//		return ret;
//	}
//};
//
//
//
//
//int main(int argc, char *argv[])
//{
//	float data[18][4] = {
//		{ 1, 1, 1, 1},		// 0
//		{-1, 1, 1, 1},		// 1
//		{-1, 1,-1, 1},		// 2
//		{ 1, 1,-1, 1},		// 3
//		{ 1,-1, 1, 1},		// 4
//		{-1,-1, 1, 1},		// 5
//		{-1,-1,-1, 1},		// 6
//		{ 1,-1,-1, 1},		// 7
//
//							// 五角星
//		{    0,    1, 0.25, 1},		// A
//		{ 0.95, 0.30, 0.25, 1},		// B
//		{ 0.58,-0.81, 0.25, 1},		// C
//		{-0.58,-0.81, 0.25, 1},		// D
//		{-0.95, 0.30, 0.25, 1},		// E
//		{    0,    1,-0.25, 1},		// A'
//		{ 0.95, 0.30,-0.25, 1},		// B'
//		{ 0.58,-0.81,-0.25, 1},		// C'
//		{-0.58,-0.81,-0.25, 1},		// D'
//		{-0.95, 0.30,-0.25, 1}		// E'
//
//
//
//
//
//
//
//	};
//	
//	int index[27][2] = {
//		{ 0, 1},
//		{ 1, 2},
//		{ 2, 3},
//		{ 3, 0},
//		{ 4, 5},
//		{ 5, 6},
//		{ 6, 7},
//		{ 7, 4},
//		{ 0, 4},
//		{ 1, 5},
//		{ 2, 6},
//		{ 3, 7},
//
//		{  8, 10},
//		{  8, 11},
//		{  9, 12},
//		{  9, 11},
//		{ 10, 12},
//		{  8, 13},
//		{  9, 14},
//		{ 10, 15},
//		{ 11, 16},
//		{ 12, 17},
//		{ 13, 16},
//		{ 13, 15},
//		{ 14, 17},
//		{ 14, 16},
//		{ 17, 15}
//	};
//	Mat4 transform1 = Mat4::Identity();				// 变换矩阵
//	Mat4 transform2 = Mat4::Identity();				// 变换矩阵
//
//	Mat4 perspective = Mat4::Perspective(60,1.0f);	// 透视矩阵
//	Camera camera = Camera::CreateCamera(0,3,6);	// 摄像机(包含连个矩阵，先平移后旋转)
//	Mat4 rotatePerFrame;	// 每帧围绕y轴旋转
//	float angleSpeed = 30;	// 旋转速度 （度/每秒）
//	float curAngle = 0;
//	float fpsTime = 0;		// FPS 一秒显示一次
//
//	initgraph(screenX, screenY, true);
//	BeginBatchDraw();
//	while (!_kbhit())
//	{
//
//		// 清屏
//		cleardevice();
//		
//		// 更新变换矩阵
//		transform1 = Mat4::Identity();
//		transform2 = Mat4::Identity();
//
//		// 计算时间
//		Time().Update();
//
//		// 更新角度值
//		curAngle += angleSpeed * Time().deltaTime;
//		if (curAngle > 360)
//			curAngle -= 360;
//
//		// 添加模型矩阵
//		rotatePerFrame = Mat4::Rotate(0, curAngle, 0);
//		transform1.AddRotate(rotatePerFrame);
//		transform2.AddRotate(rotatePerFrame);
//		transform1.AddTranslate(-1.5, 0, 0);
//		transform2.AddTranslate(1.5, 0, 0);
//
//		// 添加摄像机
//		transform1.AddTranslate(camera.translate);
//		transform1.AddRotate(camera.rotate);
//		transform2.AddTranslate(camera.translate);
//		transform2.AddRotate(camera.rotate);
//
//		// 添加投影矩阵
//		transform1.AddPerspective(perspective);
//		transform2.AddPerspective(perspective);
//
//
//
//
//		//	正方体
//		for (int i = 0; i < 12; ++i)
//		{
//			// 取得数据
//			Vector4 start = data[index[i][0]];
//			Vector4 end = data[index[i][1]];
//
//			start = transform1 * start;
//			end = transform1 * end;
//
//			
//
//			if (abs(start.x) > start.w || abs(start.y) > start.w || abs(start.z) > start.w)
//			{
//				continue;
//			}
//			if (abs(end.x) > end.w || abs(end.y) > end.w || abs(end.z) > end.w)
//			{
//				continue;
//			}
//
//			start = start.Normalize();
//			end = end.Normalize();
//
//			// 画图
//			Line(start.x * View2Screen, start.y * View2Screen, end.x * View2Screen, end.y * View2Screen);
//		}
//
//
//		// 五角星
//		for (int i = 12; i < 27; ++i)
//		{
//			// 取得数据
//			Vector4 start = data[index[i][0]];
//			Vector4 end = data[index[i][1]];
//
//			start = transform2 * start;
//			end = transform2 * end;
//
//
//
//			if (abs(start.x) > start.w || abs(start.y) > start.w || abs(start.z) > start.w)
//			{
//				continue;
//			}
//			if (abs(end.x) > end.w || abs(end.y) > end.w || abs(end.z) > end.w)
//			{
//				continue;
//			}
//
//			start = start.Normalize();
//			end = end.Normalize();
//
//			// 画图
//			Line(start.x * View2Screen, start.y * View2Screen, end.x * View2Screen, end.y * View2Screen);
//		}
//
//
//
//		TCHAR FPS[16];
//		if (Time().time >= fpsTime)
//		{
//			wsprintf(FPS, TEXT("FPS : %d"), (int)(1.0 / Time().deltaTime));
//			fpsTime += 1;
//		}
//		setcolor(RGB(255, 255, 0));
//		outtextxy(0, 0, FPS);
//		FlushBatchDraw();
//	}
//
//	EndBatchDraw();
//	system("pause");
//	return 0;
//}
